#!/bin/bash
# 邮件配置脚本 - 支持幂等执行

set -e  # 遇到错误立即退出

# 配置参数
SMTP_USER="ht_qaq@163.com"
SMTP_PASSWORD="FNahSZ4CTxAZJ9Nm"
SMTP_SERVER="smtp.163.com"
SMTP_PORT="465"
NSS_DB_DIR="/etc/pki/nssdb"
CERT_FILE="${NSS_DB_DIR}/163.crt"
HOST_IP=$(hostname -I | awk '{print $2}')

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# 检查并安装必要软件
install_packages() {
    log "检查并安装必要软件包..."
    
    # 检查 mailx/mail
    if ! command -v mail &> /dev/null && ! command -v mailx &> /dev/null; then
        log "安装 mailx..."
        if command -v yum &> /dev/null; then
            yum install -y mailx > /dev/null 2>&1
        elif command -v apt &> /dev/null; then
            apt update > /dev/null 2>&1
            apt install -y mailutils > /dev/null 2>&1
        else
            log "错误：不支持的包管理器"
            exit 1
        fi
    fi
    
    # 检查 openssl
    if ! command -v openssl &> /dev/null; then
        log "安装 openssl..."
        if command -v yum &> /dev/null; then
            yum install -y openssl > /dev/null 2>&1
        else
            apt install -y openssl > /dev/null 2>&1
        fi
    fi
    
    # 检查 certutil
    if ! command -v certutil &> /dev/null; then
        log "安装 nss-tools..."
        if command -v yum &> /dev/null; then
            yum install -y nss-tools > /dev/null 2>&1
        else
            apt install -y libnss3-tools > /dev/null 2>&1
        fi
    fi
}

# 配置邮件设置（幂等）
configure_mail() {
    log "配置邮件设置..."
    
    # 检查是否已配置（通过密码是否存在判断）
    if grep -q "smtp-auth-password=${SMTP_PASSWORD}" /etc/mail.rc 2>/dev/null; then
        log "邮件配置已存在，跳过配置"
        return 0
    fi
    
    # 备份原有配置
    if [ -f /etc/mail.rc ]; then
        cp /etc/mail.rc /etc/mail.rc.bak.$(date +%Y%m%d%H%M%S)
    fi
    
    # 添加邮件配置
    cat >> /etc/mail.rc << EOF
# 邮件配置 - 自动生成
set nss-config-dir=${NSS_DB_DIR}
set ssl-verify=ignore
set from=${SMTP_USER}
set smtp=smtps://${SMTP_SERVER}:${SMTP_PORT}
set smtp-auth-user=${SMTP_USER}
set smtp-auth-password=${SMTP_PASSWORD}
set smtp-auth=login
set smtp-timeout=30
EOF
    
    # 设置文件权限
    chmod 600 /etc/mail.rc
    log "邮件配置完成"
}

# 设置证书（幂等）
setup_certificate() {
    log "设置SSL证书..."
    
    # 创建证书目录
    mkdir -p ${NSS_DB_DIR}
    
    # 检查证书是否已存在
    if [ -f "${CERT_FILE}" ]; then
        log "证书文件已存在，跳过下载"
    else
        log "下载邮箱证书..."
        echo -n | openssl s_client -connect ${SMTP_SERVER}:${SMTP_PORT} 2>/dev/null | \
        sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ${CERT_FILE}
        
        if [ ! -s "${CERT_FILE}" ]; then
            log "错误：证书下载失败"
            exit 1
        fi
    fi
    
    # 检查证书是否已安装
    if certutil -L -d ${NSS_DB_DIR} 2>/dev/null | grep -q "163 Mail Certificate"; then
        log "证书已安装，跳过安装"
    else
        log "安装证书到NSS数据库..."
        certutil -A -n "163 Mail Certificate" -t "P,P,P" -d ${NSS_DB_DIR} -i ${CERT_FILE} > /dev/null 2>&1
        
        # 验证安装
        if certutil -L -d ${NSS_DB_DIR} 2>/dev/null | grep -q "163 Mail Certificate"; then
            log "证书安装成功"
        else
            log "错误：证书安装失败"
            exit 1
        fi
    fi
}

# 验证邮件功能
test_email() {
    log "验证邮件发送功能..."
    
    local test_subject="【邮件配置验证】服务器IP: ${HOST_IP}"
    local test_message="邮件配置验证成功！\n\n服务器信息：\n- 主机名: $(hostname)\n- IP地址: ${HOST_IP}\n- 时间: $(date '+%Y-%m-%d %H:%M:%S')\n\n此邮件表示邮件配置正常工作。"
    
    echo -e "${test_message}" | mail -s "${test_subject}" ${SMTP_USER} 2>&1
    
    if [ $? -eq 0 ]; then
        log "✅ 验证邮件发送成功！主题包含IP: ${HOST_IP}"
    else
        log "❌ 验证邮件发送失败"
        exit 1
    fi
}

# 主函数
main() {
    log "开始邮件配置..."
    
    install_packages
    configure_mail
    setup_certificate
    test_email
    
    log "邮件配置完成！"
    log "服务器IP ${HOST_IP} 的邮件功能已就绪"
}

# 执行主函数
main 

